import { Logs } from 'src/logs/logs.entity';
import {
    AfterInsert,
    AfterRemove,
    Column,
    CreateDateColumn,
    Entity,
    JoinTable,
    ManyToMany,
    OneToMany,
    OneToOne,
    PrimaryGeneratedColumn,
    UpdateDateColumn,
} from 'typeorm';
import { Profile } from './profile.entity';
import { Roles } from 'src/roles/entities/role.entity';

@Entity('user')
export class User {
    @PrimaryGeneratedColumn('uuid') // 设置主键
    id: string;

    @Column({
        type: 'varchar',
        length: 50,
        unique: true, // 是否必填
        comment: '用户名',
    })
    username: string;

    @Column({
        type: 'varchar',
        length: 255,
        comment: '密码',
        // select: false, // 设置接口是否返回
    })
    password: string;


    @Column({
        type: 'varchar',
        length: 255,
        comment: 'token',
        default: null
    })
    token: string;


    @CreateDateColumn()
    createdAt: Date;

    @UpdateDateColumn()
    updatedAt: Date;

    // 外键约束  和日志表和user表的关系 是  一个用户可以对应多个日志  
    // user表和logs表 都要声明 一对多的关系
    // 第二次参数 的意思是 告诉查询语句 对应user字段去联合查询
    @OneToMany(() => Logs, (logs) => logs.user)
    logs: Logs[];  // 查询的结果应该是一个数组


    /* 
    多对多的关系 
    用户表和角色表
    一个用户可能有多个角色
    一个角色也可以分配给多个用户
    JoinTable 修饰符  生成一个user_roles的关系表
    */
    //  cascade 的值为 insert 只有在新增操作时 才联合更新
    @ManyToMany(() => Roles, (roles) => roles.user , {cascade:['insert']})
    @JoinTable({ 
        name: "users_roles",
        /**
         * 想做的功能是：新增 role 时自动在关联表中创建对应关系
         * - 1. 定义实体和关联关系 （在此处注释的两行）
         * - 2. Role 的服务中处理新增逻辑 （传参时客户端传递一个userId  查询对应用户 进行新增逻辑）
         *  */ 

        // joinColumn:{name:"userId" , referencedColumnName:"id"},
        // inverseJoinColumn:{name:"roleId", referencedColumnName:"id"}
    })
    roles: Roles[]

    /* 
    user表和profile表  一对一   第二个参数相当于是索引  对比profile表的userId  第三个参数 用于多模型联合更新  值为true时 所有操作都会更新
    */
    @OneToOne(() => Profile , (profile)=>profile.user  , {cascade:true})
    profile: Profile;

    @AfterInsert()
    afterInsert(){
        console.log('afterInsert触发');
    }

    @AfterRemove()
    afterRemove(){
        console.log("afterRemove触发");
    }

}
